# -*- coding: utf-8 -*-
"""
配置模块初始化文件
统一管理所有配置类和环境变量
"""

import os
from datetime import timedelta
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

class BaseConfig:
    """基础配置类"""
    
    # Flask基础配置
    SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key-change-in-production')
    DEBUG = False
    TESTING = False
    
    # 站点URL配置
    SITE_URL = os.environ.get('SITE_URL', 'https://hm.yunxitech.cn')
    
    # 数据库配置
    MYSQL_HOST = os.environ.get('MYSQL_HOST', 'localhost')
    MYSQL_PORT = int(os.environ.get('MYSQL_PORT', 3306))
    MYSQL_USER = os.environ.get('MYSQL_USER', 'root')
    MYSQL_PASSWORD = os.environ.get('MYSQL_PASSWORD', '')
    MYSQL_DATABASE = os.environ.get('MYSQL_DATABASE', 'venue_booking')
    
    SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USER}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}?charset=utf8mb4"
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_size': int(os.environ.get('DB_POOL_SIZE', 10)),
        'pool_timeout': int(os.environ.get('DB_POOL_TIMEOUT', 20)),
        'pool_recycle': int(os.environ.get('DB_POOL_RECYCLE', 3600)),
        'max_overflow': int(os.environ.get('DB_MAX_OVERFLOW', 0)),
        'echo': os.environ.get('DB_ECHO', 'false').lower() == 'true'
    }
    
    # JWT配置
    JWT_SECRET_KEY = os.environ.get('JWT_SECRET_KEY', 'jwt-secret-key-change-in-production')
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(hours=int(os.environ.get('JWT_EXPIRES_HOURS', 168)))  # 默认7天
    JWT_ALGORITHM = 'HS256'
    # 禁用JWT CSRF保护（因为我们使用Bearer token）
    JWT_CSRF_IN_COOKIES = False
    JWT_ACCESS_CSRF_HEADER_NAME = "X-CSRF-TOKEN"
    JWT_ACCESS_CSRF_FIELD_NAME = "csrf_token"
    
    # 微信小程序配置
    WECHAT_APPID = os.environ.get('WECHAT_APPID', '')
    WECHAT_SECRET = os.environ.get('WECHAT_SECRET', '')
    
    # 跨域配置
    CORS_ORIGINS = os.environ.get('CORS_ORIGINS', 'http://localhost:8080,http://127.0.0.1:8080').split(',')
    
    # 文件上传配置
    UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'uploads'))
    MAX_CONTENT_LENGTH = int(os.environ.get('MAX_CONTENT_LENGTH', 16 * 1024 * 1024))  # 16MB
    ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'pdf', 'doc', 'docx'}
    
    # 微信支付配置
    WECHAT_PAY_CONFIG = {
        'app_id': os.environ.get('WECHAT_APP_ID', ''),
        'mch_id': os.environ.get('WECHAT_MCH_ID', ''),
        'key': os.environ.get('WECHAT_PAY_KEY', ''),
        'notify_url': os.environ.get('WECHAT_NOTIFY_URL', ''),
        'cert_path': os.environ.get('WECHAT_CERT_PATH', ''),
        'key_path': os.environ.get('WECHAT_KEY_PATH', '')
    }
    
    # 安全配置
    WTF_CSRF_ENABLED = True
    WTF_CSRF_SECRET_KEY = os.environ.get('WTF_CSRF_SECRET_KEY', 'csrf-secret-key-change-in-production')
    
    # 日志配置
    LOG_LEVEL = 'INFO'
    LOG_FILE = os.environ.get('LOG_FILE', os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'logs', 'app.log'))
    LOG_FORMAT = '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
    
    # 分页配置
    POSTS_PER_PAGE = int(os.environ.get('POSTS_PER_PAGE', 10))
    ORDERS_PER_PAGE = int(os.environ.get('ORDERS_PER_PAGE', 20))
    USERS_PER_PAGE = int(os.environ.get('USERS_PER_PAGE', 20))
    
    # 缓存配置
    CACHE_TYPE = os.environ.get('CACHE_TYPE', 'simple')
    CACHE_DEFAULT_TIMEOUT = int(os.environ.get('CACHE_DEFAULT_TIMEOUT', 300))
    
    # Redis配置（可选）
    REDIS_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/0')
    
    # Celery配置
    CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://localhost:6379/0')
    CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'redis://localhost:6379/1')
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
    CELERY_ACCEPT_CONTENT = ['json']
    CELERY_TIMEZONE = 'Asia/Shanghai'
    CELERY_ENABLE_UTC = True
    
    # 性能监控配置
    ENABLE_PERFORMANCE_MONITORING = os.environ.get('ENABLE_PERFORMANCE_MONITORING', 'true').lower() == 'true'
    LOG_MEMORY_USAGE = os.environ.get('LOG_MEMORY_USAGE', 'false').lower() == 'true'
    SLOW_QUERY_THRESHOLD = float(os.environ.get('SLOW_QUERY_THRESHOLD', 1.0))  # 秒
    SLOW_API_THRESHOLD = float(os.environ.get('SLOW_API_THRESHOLD', 2.0))  # 秒
    
    # 缓存配置优化
    VENUE_CACHE_TIMEOUT = int(os.environ.get('VENUE_CACHE_TIMEOUT', 1800))  # 30分钟
    USER_CACHE_TIMEOUT = int(os.environ.get('USER_CACHE_TIMEOUT', 3600))    # 1小时
    ORDER_CACHE_TIMEOUT = int(os.environ.get('ORDER_CACHE_TIMEOUT', 300))   # 5分钟
    
    # 数据库查询优化
    MAX_QUERY_RESULTS = int(os.environ.get('MAX_QUERY_RESULTS', 1000))
    ENABLE_QUERY_CACHE = os.environ.get('ENABLE_QUERY_CACHE', 'true').lower() == 'true'
    
    # 文件上传优化
    ENABLE_FILE_COMPRESSION = os.environ.get('ENABLE_FILE_COMPRESSION', 'true').lower() == 'true'
    MAX_FILE_SIZE = int(os.environ.get('MAX_FILE_SIZE', 10 * 1024 * 1024))  # 10MB
    
    # 安全优化
    RATE_LIMIT_ENABLED = os.environ.get('RATE_LIMIT_ENABLED', 'true').lower() == 'true'
    RATE_LIMIT_DEFAULT = os.environ.get('RATE_LIMIT_DEFAULT', '100 per minute')
    RATE_LIMIT_STORAGE_URL = os.environ.get('RATE_LIMIT_STORAGE_URL', 'redis://localhost:6379/2')
    
    # 异步任务配置
    ENABLE_ASYNC_TASKS = os.environ.get('ENABLE_ASYNC_TASKS', 'true').lower() == 'true'
    ASYNC_TASK_WORKERS = int(os.environ.get('ASYNC_TASK_WORKERS', 4))
    
    @staticmethod
    def init_app(app):
        """初始化应用配置"""
        pass


class DevelopmentConfig(BaseConfig):
    """开发环境配置"""
    DEBUG = True
    LOG_LEVEL = 'INFO'
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_size': 5,
        'pool_timeout': 10,
        'pool_recycle': 1800,
        'max_overflow': 0,
        'echo': True
    }
    
    # 开发环境性能监控
    ENABLE_PERFORMANCE_MONITORING = True
    LOG_MEMORY_USAGE = True
    SLOW_QUERY_THRESHOLD = 0.5  # 开发环境更敏感
    SLOW_API_THRESHOLD = 1.0


class TestingConfig(BaseConfig):
    """测试环境配置"""
    TESTING = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'
    WTF_CSRF_ENABLED = False
    
    # 测试环境禁用缓存
    CACHE_TYPE = 'null'
    ENABLE_QUERY_CACHE = False
    ENABLE_ASYNC_TASKS = False


class ProductionConfig(BaseConfig):
    """生产环境配置"""
    DEBUG = False
    
    # 生产环境数据库连接池优化
    SQLALCHEMY_ENGINE_OPTIONS = {
        'pool_size': int(os.environ.get('DB_POOL_SIZE', 20)),
        'pool_timeout': int(os.environ.get('DB_POOL_TIMEOUT', 30)),
        'pool_recycle': int(os.environ.get('DB_POOL_RECYCLE', 3600)),
        'max_overflow': int(os.environ.get('DB_MAX_OVERFLOW', 10)),
        'echo': False
    }
    
    # 生产环境安全配置
    WTF_CSRF_ENABLED = True
    
    # 生产环境性能优化
    ENABLE_PERFORMANCE_MONITORING = True
    LOG_MEMORY_USAGE = False  # 生产环境减少日志
    SLOW_QUERY_THRESHOLD = 1.0
    SLOW_API_THRESHOLD = 2.0
    
    # 生产环境缓存优化
    CACHE_TYPE = 'redis'
    VENUE_CACHE_TIMEOUT = 3600  # 1小时
    USER_CACHE_TIMEOUT = 7200   # 2小时
    
    @classmethod
    def init_app(cls, app):
        """生产环境特殊初始化"""
        BaseConfig.init_app(app)
        
        # 生产环境日志配置
        import logging
        from logging.handlers import RotatingFileHandler
        
        if not app.debug and not app.testing:
            if not os.path.exists('logs'):
                os.mkdir('logs')
            
            file_handler = RotatingFileHandler(
                cls.LOG_FILE, 
                maxBytes=10240000, 
                backupCount=10
            )
            file_handler.setFormatter(logging.Formatter(cls.LOG_FORMAT))
            file_handler.setLevel(logging.INFO)
            app.logger.addHandler(file_handler)
            app.logger.setLevel(logging.INFO)
            app.logger.info('体育场馆预约系统启动')


# 配置字典
config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}
